package com.java.chen.io;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

import com.java.chen.Util;

/**
 * @author Administrator File的 Add delete search...
 */
public class FileOperation {
	static String localPath = Util.getLocalPath();

	public static void main(String[] args) {
		createFile1(false);
	}

	/**
	 * 创建File对象方式:File(String pathname)及大部分的常用方法、属性
	 * 
	 * @param absoulte
	 *            true绝对路径创建 false相对路径创建
	 *            
	 */
	public static void createFile1(boolean absoulte) {

		try {
			File file = null;
			if (absoulte) {
				file = new File(localPath + "\\test.txt");
			} else {
				file = new File("test.txt");
			}
			file.createNewFile();
			System.out.println("文件绝对路径：" + file.getAbsolutePath() + "\n");
			System.out.println("获取绝对路径文件对象：" + file.getAbsoluteFile() + "\n");
			System.out.println("文件路径：" + file.getPath() + "\n");
			System.out.println("文件父目录路径：" + file.getParent() + "\n");
			System.out.println("父目录文件对象：" + file.getParentFile() + "\n");
			// getCanonicalPath 与getAbsolutePath得到的路径一样
			// getCanonicalPath是规范后的路径，这个与操作系统有关，如果unix上是'/'到了windows后此方法会自动规范成‘\’
			// 所以获取绝对路径getCanonicalPath这个方法更可靠
			System.out.println("规范后的绝对路径：" + file.getCanonicalPath() + "\n");
			System.out
					.println("规范后的绝对路径文件对象：" + file.getCanonicalFile() + "\n");
			System.out.println("文件所属磁盘的空闲大小：" + file.getFreeSpace() / 1024
					/ 1024 / 1024 + "GB" + "\n");
			System.out.println("文件所属磁盘的总共大小：" + file.getTotalSpace() / 1024
					/ 1024 / 1024 + "GB" + "\n");
			System.out.println("文件所属磁盘的可用大小：" + file.getUsableSpace() / 1024
					/ 1024 / 1024 + "GB" + "\n");
			System.out.println("文件名称：" + file.getName() + "\n");
			System.out.println("是否是绝对路径"+file.isAbsolute());
			System.out.println("是否是一个目录"+file.isDirectory());
			System.out.println("是否是文件"+file.isFile());
			System.out.println("是否是隐藏文件"+file.isHidden());
			System.out.println("文件的长度"+file.length());
			System.out.println("修改前:最后一次修改时间"+file.lastModified());
			file.setLastModified(521);//设置最后一次修改时间
			System.out.println("修改后:最后一次修改时间"+file.lastModified());
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 创建File对象方式: File(String parent,String child)
	 * 二者使用都一样	 File(File parent,String child)
	 */
	public static void createFile2() {
		File file=new File(localPath,"test.txt");
		System.out.println(file.getAbsolutePath());
		//parent和child都可以是""字符串。如果parent是空字符串那么输出路径不再是当前项目的路径了，而是当前分区的路径如E:\
		File file1=new File("","test.txt");
		System.out.println(file1.getAbsolutePath());
		//如果child是null那么会抛出异常，new File("",null);
	}
	
	/**
	 * 创建临时文件夹
	 * prefix前缀，suffix后缀，directory指定文件夹，允许没有后缀。
	 * 生成的文件名：prefix3157088585784882433suffix,中间是系统随机分配的
	 * 如果指定directory：那么创建时就会在指定目录生成临时文件
	 * 如果不指定directory那么创建时目录系统C:\Users\ADMINI~1\AppData\Local\Temp(不同的系统可能不同)
	 * createTempFile(String prefix, String suffix)
	 * createTempFile(String prefix, String suffix,File directory)
	 * 
	 */
	public static void createTempFile(){
		
		try {
			File file1 = File.createTempFile("before=", "=afer");//前缀,后缀
			System.out.println(file1.getAbsolutePath());
			File file2 = File.createTempFile("before=", "");//只有前缀
			System.out.println(file2.getAbsolutePath());
			//指定前后缀，指定生成临时文件的路径
			File file3 = File.createTempFile("before=", "=afer",new File(localPath));
			System.out.println(file3.getAbsolutePath());
		} catch (IOException e) {
			e.printStackTrace();
		}
	
	}
	
	/**
	 * 文件的权限 
	 * 可读,可写 ,可执行
	 * windows下面只有可写能够设置，其他可执行、可读不管如何设置始终返回true
	 */
	public static void fileAuth(){
		try {
			File file=new File("test.txt");
			if(!file.exists()){
				file.createNewFile();
			}
			
			
			System.out.println("befor-可执行"+file.canExecute());
			System.out.println("befor-可读"+file.canRead());
			System.out.println("befor-可写"+file.canWrite());
			System.out.println("=======================");
			file.setExecutable(false);
			file.setReadable(false);
			file.setWritable(false);
			System.out.println("=======================");
			System.out.println("afer-可执行"+file.canExecute());
			System.out.println("afer-可读"+file.canRead());
			System.out.println("afer-可写"+file.canWrite());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 文件/文件夹创建/删除相关
	 * 
	 * 
	 */
	public static void directoryCreate(){
		File file=new File("test\\t.x");
		if(file.exists()){
			file.delete();//立即删除
//			deleteOnExit() 这个表示在虚拟机退出时才删除
		}else{
//			file.mkdir();//创建1级文件夹
//			file.mkdirs();//创建多级文件夹目录
		}
		try {
			file.createNewFile();//如果创建文件的路径不存在 会报异常
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * list()和listFile()是一样的 都是返回当前层的文件夹和文件  一个是返回string[]，一个是返回File[]
	 */
	public static  void listFile1(){
		File file=new File(localPath);
		String str[]=file.list();
		File fstr[]=file.listFiles();
		for(String s:str){
			System.out.println("list()方法遍历出的："+s.toString());
		}
		System.out.println("=============================");
		for(File s:fstr){
			System.out.println("listFiles()方法遍历出的："+s.getName().toString());
		}
	}
	
	
	/**
	 *  遍历加条件
	 *  
	 *  这种遍历方式是要传递一些过滤条件，这个过滤条件是个接口FileFilter和FilenameFilter
	 *  FileFilter 是只有一个参数就是文件对象
	 *  FilenameFilter 有2个参数一个是文件路径，一个是名字
	 *  这2个方法的用法，就是如果我们遍历时发现了某一个文件或者文件夹我们需要操作比如删除重命名等
	 *  这2个方法如果return false就不执行遍历 return true遍历
	 *  
	 */
	public static void listFileAndFilter(){
		File file=new File(localPath);
		File fstr[]=file.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File pathname) {
				if(pathname.getName().equals(".settings")){ //如果遍历到某个文件叫.settings我们就删除
					pathname.delete();
				}
				return true;
			}
		});
		
		for(File f:fstr){
			System.out.println(f.getName());
		}
		
		
		
//		 File fstr2[]=file.listFiles(new FilenameFilter() {
//			
//			@Override
//			public boolean accept(File dir, String name) {
//				return false;
//			}
//		});
		
	}

	
	/**
	 * 文件重命名
	 */
	public static void reneamFile(){
		 File file=new File("test.txt");
		 try {
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
		  //test.txt 改名字为test1.txt
		  //重命名可以是跨目录的重命名，即原文件在D:\X，被重命名的文件路径可以在D：\X1\X2\XX
		  //但是重命名后的目录和原文件的目录必须在一个分区中
		 file.renameTo(new File("src\\test1.txt")); 
	}
	
	/**
	 * 遍历出某个路径下的所有文件和文件夹
	 * 递归遍历
	 */
	public static void fileListAll(String path){
		File file=new File(path);
		File f[]=file.listFiles();
		for(File fs:f){
			if(fs.isDirectory()){
				fileListAll(fs.getAbsolutePath());
			}else{
				System.out.println(fs.getName());
			}
		}
		
	}
	
		
		

  

}
